/**
 * 认证守卫
 * 用于保护需要登录的路由
 */

// 模拟认证状态检查（实际项目中应该从状态管理或本地存储获取）
function isAuthenticated() {
  // 这里应该检查用户是否已登录
  // 可以检查 localStorage、sessionStorage 或 Vuex/Pinia 状态
  const token = localStorage.getItem('auth_token')
  const user = localStorage.getItem('user_info')
  
  return token && user
}

// 获取用户信息
function getUserInfo() {
  try {
    const userInfo = localStorage.getItem('user_info')
    return userInfo ? JSON.parse(userInfo) : null
  } catch (error) {
    console.error('获取用户信息失败:', error)
    return null
  }
}

// 检查用户是否为管理员
function isAdmin() {
  const userInfo = getUserInfo()
  return userInfo && userInfo.role === 'admin'
}

// 清除认证信息
function clearAuthInfo() {
  localStorage.removeItem('auth_token')
  localStorage.removeItem('user_info')
}

// 根据用户角色获取默认重定向路径
function getDefaultRedirectPath(userRole) {
  switch (userRole) {
    case 'admin':
      return '/admin/dashboard'
    case 'user':
      return '/user/dashboard'
    default:
      return '/user/dashboard'
  }
}

// 认证守卫函数
export function authGuard(to, from, next) {
  // 检查路由是否需要认证
  if (to.matched.some(record => record.meta.requiresAuth)) {
    // 检查用户是否已登录
    if (!isAuthenticated()) {
      // 未登录，重定向到登录页
      next({
        path: '/login',
        query: {
          redirect: to.fullPath // 保存原始路径，登录后可以重定向回来
        }
      })
      return
    }
    
    // 验证用户信息有效性
    const userInfo = getUserInfo()
    if (!userInfo) {
      // 用户信息无效，清除认证信息并重定向到登录页
      clearAuthInfo()
      next({
        path: '/login',
        query: {
          redirect: to.fullPath
        }
      })
      return
    }
    
    // 检查是否需要管理员权限
    if (to.matched.some(record => record.meta.requiresAdmin)) {
      if (!isAdmin()) {
        // 非管理员用户尝试访问管理员页面，重定向到用户首页
        next({
          path: '/user/dashboard',
          query: {
            error: 'permission_denied'
          }
        })
        return
      }
    }
    
    // 如果用户访问的是错误的角色区域，进行重定向
    if (userInfo.role === 'admin' && to.path.startsWith('/user/')) {
      // 管理员访问用户页面，重定向到管理员首页
      next('/admin/dashboard')
      return
    }
    
    if (userInfo.role === 'user' && to.path.startsWith('/admin/')) {
      // 普通用户访问管理员页面，重定向到用户首页
      next('/user/dashboard')
      return
    }
    
    // 已登录且权限验证通过，继续访问
    next()
  } else {
    // 不需要认证的路由，直接通过
    next()
  }
}

// 登录状态检查（用于组件中）
export function checkAuth() {
  return isAuthenticated()
}

// 获取当前用户信息（用于组件中）
export function getCurrentUser() {
  return getUserInfo()
}

// 检查管理员权限（用于组件中）
export function checkAdmin() {
  return isAdmin()
}

// 登出函数
export function logout() {
  clearAuthInfo()
  // 可以在这里添加登出后的清理工作
  // 比如清除其他缓存数据等
}

// 登录函数（模拟）
export function login(credentials) {
  // 这里应该调用实际的登录API
  // 现在只是模拟登录成功
  let mockUser = {
    id: '1',
    username: credentials.username || 'user',
    email: credentials.email || 'user@example.com',
    role: 'user',
    avatar: '',
    loginTime: new Date().toISOString()
  }
  
  // 根据用户名判断角色（模拟）
  if (credentials.username === 'admin' || credentials.username === 'administrator') {
    mockUser.role = 'admin'
    mockUser.id = '0'
    mockUser.email = 'admin@example.com'
  }
  
  const mockToken = 'mock-jwt-token-' + Date.now()
  
  // 保存认证信息
  localStorage.setItem('auth_token', mockToken)
  localStorage.setItem('user_info', JSON.stringify(mockUser))
  
  return Promise.resolve({
    success: true,
    user: mockUser,
    token: mockToken,
    redirectPath: getDefaultRedirectPath(mockUser.role)
  })
}

// 导出默认的认证守卫
export default authGuard 